# Постановка задачи и вводные данные.
# От команды редакторов электронного журнала “Такие новости” пришла задача на разработку программы для анализа постов.
# Они хотят сократить длину текста, чтобы уменьшить время чтения новостей. Для этого нужно во всех новостях найти 10 самых 
# популярных слов, где слово длиннее 6 символов.
# Команда предоставила вам два файла с новостями в формате .json и .xml. Ознакомьтесь с ними прежде чем приступить 
# к следующему этапу. Обратите внимание на поля description в списке items.

# Первым делом нужно написать функцию для чтения файла с информацией по новостями.
# На заметку:
# Мы всегда должны убирать логику программы в функции. Так код становится намного чище и понятнее. 
# Также для проверки мы должны запускать функцию. Таким образом мы убедимся на начальном этапе, правильно ли она работает.

import collections
# Хорошая статья про крутой модуль collections - "Не изобритайте велосипед"
# https://proglib.io/p/ne-izobretat-velosiped-ili-obzor-modulya-collections-v-python-2019-12-15
# Избавляет от значительного гемороя при работе со списками, словарями, кортежами
# Для решения задачи мы использовали из модуля collections класс Counter.
# Он автоматически подсчитывает количество вхождений слов в списке. 
# И с помощью метода most_common можно получить топ нужных слов.
import json
# Функция умеющая читать и преобразовывать json в словарь
def read_json(file_patch, max_Len_word=6, top_words=10): # аргумент функции max_Len_word фильтрует слова в списке новостей длиной больше 6 символов
    # аргумент функции top_words отбирает 10 самых популярных слов
    """read_json('file_patch, max_Len_word, top_words') -> file_patch -, max_Len_word -, top_words -"""
    with open(file_patch, encoding='utf-8') as news_file:
        news = json.load(news_file)
        # Получение слов из описания всех новостей
        # Теперь news - это просто словарь, и мы можем обращаться к значениям по ключам.
        # Теперь, когда есть доступ к json файлу, нужно получить из него 
        # все слова новостей. Точнее не из новостей, а из их описания (description).
        # Для простоты слова будем разделять только пробелами.
        description_words = []
        for item in news['rss']['channel']['items']:
            description = [word for word in item['description'].split(' ') if len(word) > max_Len_word]
            description_words.extend(description)
            counter_words = collections.Counter(description_words)
        print(counter_words.most_common(top_words))
# collections.Counter - вид словаря, который позволяет считать количество неизменяемых объектов
# most_common([n]) - возвращает n наиболее часто встречающихся элементов, в порядке убывания встречаемости. 
# Если n не указано, возвращаются все элементы.

if __name__ == '__main__':
    read_json('qwiz/newsafr_qwiz.json')
# if __name__ == '__main__' Разделение кода, который будет выполнятся при вызове кода как модуля 
# (при импортировании его в другой скрипт) – и при запуске самого модуля, 
# как отдельного файла.

